package com.example.wifi2;

import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.widget.Toast;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;

// 导入 ContentProvider 相关的类
import com.example.wifi2.HistoryContentProvider;

public class WifiReceiver extends BroadcastReceiver {

    private static final String TAG = "WifiReceiver";
    // 增加延迟到2秒，给系统更多时间获取连接信息，对于Android 11通常1秒也够，但2秒更稳妥
    private static final long CHECK_DELAY_MS = 2000;
    // 定义一个自定义的Action和Extra Keys
    public static final String ACTION_WIFI_STATE_CHANGED = "com.example.wifi2.WIFI_STATE_CHANGED";
    public static final String EXTRA_SSID = "extra_ssid";
    public static final String EXTRA_CONNECTED = "extra_connected";

    @SuppressLint("MissingPermission")
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, ">>>>>>>>>>>> WifiReceiver onReceive Triggered, Action: " + intent.getAction());
        String action = intent.getAction();

        // 监听网络状态变化广播
        if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
            Log.d(TAG, "收到 NETWORK_STATE_CHANGED 广播，延迟检查连接状态...");
            // 收到网络状态变化广播后，延迟一小段时间再检查连接信息
            // 使用应用的Looper，确保Handler不会在非UI线程创建
            new Handler(Looper.getMainLooper()).postDelayed(() -> {
                checkWifiConnection(context);
            }, CHECK_DELAY_MS);
        }
        // 可以根据需要添加其他WiFi相关广播的监听，比如 SCAN_RESULTS_AVAILABLE_ACTION 等
        // 但 SCAN_RESULTS_AVAILABLE_ACTION 通常更适合在需要显示扫描结果的Activity中动态监听
    }

    @SuppressLint("MissingPermission") // 假定调用此方法的上下文环境已检查并拥有权限
    private void checkWifiConnection(Context context) {
        Log.d(TAG, "执行延迟检查连接状态...");
        WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);

        WifiInfo wifiInfo = wifiManager.getConnectionInfo();

        // 检查连接信息是否有效
        // networkId == -1 表示未连接到任何保存的网络
        // wifiInfo.getSSID() 可以是 null 或 "<unknown ssid>"
        if (wifiInfo != null && wifiInfo.getNetworkId() != -1) {
            String ssid = wifiInfo.getSSID();
            // ssid 对于普通网络是带双引号的 ("\"MyWiFi\"")
            // 对于隐藏网络或某些状态下可能是 null 或 "<unknown ssid>"
            if (ssid != null && !ssid.equals("<unknown ssid>")) {
                ssid = ssid.replace("\"", ""); // 移除双引号
                Log.d(TAG, "延迟后获取到有效连接SSID: " + ssid);

                // 显示连接成功Toast (在某些系统版本或后台可能被抑制)
                try {
                    // 使用 getApplicationContext() 更安全
                    Toast.makeText(context.getApplicationContext(), "已连接到: " + ssid, Toast.LENGTH_SHORT).show();
                } catch (Exception e) {
                    Log.e(TAG, "显示连接成功Toast失败: " + e.getMessage());
                }

                // 保存历史记录
                try {
                    // 创建 Content Values
                    ContentValues values = HistoryContentProvider.createContentValues(ssid);
                    // 插入到 Content Provider
                    Uri uri = context.getContentResolver().insert(
                            HistoryContentProvider.CONTENT_URI,
                            values
                    );
                    if (uri != null) {
                        Log.d(TAG, "历史记录已保存: " + ssid + ", Uri: " + uri.toString());
                    } else {
                        Log.e(TAG, "保存历史记录失败: Insert returned null Uri");
                    }

                } catch (Exception e) {
                    Log.e(TAG, "保存历史记录异常: " + e.getMessage());
                }

                // 发送本地广播通知 Activity 更新UI
                Intent localIntent = new Intent(ACTION_WIFI_STATE_CHANGED);
                localIntent.putExtra(EXTRA_CONNECTED, true);
                localIntent.putExtra(EXTRA_SSID, ssid);
                LocalBroadcastManager.getInstance(context.getApplicationContext()).sendBroadcast(localIntent);
                Log.d(TAG, "发送连接成功本地广播: " + ssid);

            } else {
                // 即使延迟后还是 <unknown ssid> 或 null，表示连接状态可能需要进一步确认
                // 或者连接到一个隐藏网络且应用没有权限获取SSID
                Log.d(TAG, "网络状态变化，延迟后SSID未知或无效，当前 raw SSID: " + ssid);
                // 依然发送本地广播，标记已连接但SSID未知
                Intent localIntent = new Intent(ACTION_WIFI_STATE_CHANGED);
                localIntent.putExtra(EXTRA_CONNECTED, true);
                localIntent.putExtra(EXTRA_SSID, "<unknown ssid>"); // 通知Activity SSID未知
                LocalBroadcastManager.getInstance(context.getApplicationContext()).sendBroadcast(localIntent);
                Log.d(TAG, "发送连接状态变化 (SSID未知) 本地广播");
            }
        } else {
            // 连接信息为空或 networkId 为 -1，表示当前未连接到任何网络
            Log.d(TAG, "网络状态变化，当前未连接或正在连接中...");
            // 发送一个断开连接或连接失败的广播
            Intent localIntent = new Intent(ACTION_WIFI_STATE_CHANGED);
            localIntent.putExtra(EXTRA_CONNECTED, false);
            LocalBroadcastManager.getInstance(context.getApplicationContext()).sendBroadcast(localIntent);
            Log.d(TAG, "发送断开连接本地广播");
        }
    }
}




